#include "signup.srpc.h"
#include "workflow/WFFacilities.h"
#include <crypt.h>
#include <workflow/MySQLResult.h>
using std::string;
using std::cout;
using namespace srpc;

static WFFacilities::WaitGroup wait_group(1);

void sig_handler(int signo)
{
	wait_group.done();
}

class UserServiceServiceImpl : public UserService::Service
{
public:

	void Signup(ReqSignup *request, RespSignup *response, srpc::RPCContext *ctx) override
	{
		// 这个函数是服务端的被调函数
		// request是函数的参数
		// response是函数的返回值
		// ctx是上下文 ctx->get_series 可以决定回复返回值的时机
		string username = request->username();
		string password = request->password();
		string salt("12345678");//这里应该是随机生成
        string encodedPassword(crypt(password.c_str(), salt.c_str()));
        cout << "mi wen:" << encodedPassword << "\n";
            //将用户信息存储到数据库MySQL中
        string mysqlurl("mysql://root:123@localhost");
        auto mysqlTask = WFTaskFactory::create_mysql_task(mysqlurl, 1, 
            [response](WFMySQLTask * mysqltask){
                //0. 对任务的状态进行检测
                int state = mysqltask->get_state();
                int error = mysqltask->get_error();
                if(state != WFT_STATE_SUCCESS) {
                    printf("%s\n", WFGlobal::get_error_string(state, error));
                    return;
                }
                //1. 检测SQL语句是否存在语法错误
                auto mysqlResp = mysqltask->get_resp();
                if(mysqlResp->get_packet_type() == MYSQL_PACKET_ERROR) {
                    printf("ERROR %d: %s\n", mysqlResp->get_error_code(),
                           mysqlResp->get_error_msg().c_str());
                    response->set_information("Fail");
					response->set_code(101);
                    return;
                }
                using namespace protocol;
                MySQLResultCursor cursor(mysqlResp);
                if(cursor.get_cursor_status() == MYSQL_STATUS_OK) {
                    //2. 成功写入数据库了
                    printf("Query OK. %llu row affected.\n",cursor.get_affected_rows());
                    response->set_information("Success");
					response->set_code(100);  
                } else {
                    response->set_information("Fail");
					response->set_code(102);
                }
            });
        string sql("INSERT INTO cloudisk.tbl_user(user_name, user_pwd) VALUES('");
        sql += username + "', '" + encodedPassword + "')";
        cout << "sql:\n" << sql << "\n";
    	mysqlTask->get_req()->set_query(sql);
        ctx->get_series()->push_back(mysqlTask);
	}
};

int main()
{
	GOOGLE_PROTOBUF_VERIFY_VERSION;
	// port 是一个端口号
	unsigned short port = 1412;
	// server负责等待客户端的接入
	// 当有客户端接入的时候，server 会创建一个序列
	// 序列中有一个特殊的rpc任务，它的返回值/响应是在序列中其他任务执行完之后回复的
	SRPCServer server;
	// 当有客户端接入的时候，虚函数Signup会被调用
	UserServiceServiceImpl userservice_impl;
	server.add_service(&userservice_impl);

	server.start(port);
	wait_group.wait();
	server.stop();
	google::protobuf::ShutdownProtobufLibrary();
	return 0;
}
